// 导入axios异步请求组件
import axios from "axios";
// 导入axios的请求配置文件
import axiosConfig from "./config.js"
// 导入路由对象
import router from "@/router"
// 导入用户状态管理对象
import {useUserStore} from "@/stores/user.js"
// 弹出消息框
import kvaMessage from "@/utils/kvaMessage.js";


// 创建一个实例
const request = axios.create({ ...axiosConfig })

// request 请求拦截器
request.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    // 判断请求的接口是否携带token，例如：登录、验证码不需要携带token
    if(!config.noToken){
        // 如果 token为空，证明没有登录，跳转到登录页面,否则就把token放入请求头中
        // 获取登录的token信息
        const userStore = useUserStore()
        const isLogin = userStore.isLogin
        if (!isLogin){
            router.push("/login")
            return
        }else {
            // 证明是登录过的，把token信息放入请求头中
            config.headers.Authorization = userStore.getToken()
            config.headers.KvaUUID = userStore.getUUID()
        }
    }
    return config;
}, function (error) {
    // 对请求错误做些什么
    // 判断请求超时
    if ( error.code === "ECONNABORTED" && error.message.indexOf("timeout") !== -1) {
        kvaMessage.notifyError("请求超时")
    }
    return Promise.reject(error);
});

// response 响应拦截器
request.interceptors.response.use(response => {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么

    // token续期
    if (response.headers["new-authorization"]){
        // 获取登录的token信息
        const userStore = useUserStore()
        userStore.setToken(response.headers["new-authorization"])
    }

    // 挤下线
    if (response.data.code === 4001){
        kvaMessage.notifyError(response.data.message)
        // 延迟几秒
        setTimeout(()=>{
            const userStore = useUserStore()
            // 退出登录
            userStore.logout()
        },3000)
        return
    }

    // cashbin的权限拦截处理
    if(response.data?.code === 80001){
        kvaMessage.notifyError(response.data.message);
        // 如果你想调整页面，就把下面注释打开
        //router.push("/nopermission")
        return response.data;
    }

    // 服务端成功返回的处理
    if (response.data?.code === 20000){
        return response.data
    }else {
        // 所有服务端的错误提示，都在这里进行处理
        if (response.data?.message){
            kvaMessage.notifyError(response.data.message)
        }
        // 返回接口返回的错误信息
        return Promise.reject(response.data)
    }
}, (err) => {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    if (err && err.response) {
        switch (err.response.status) {
            case 400:
                err.message = "请求错误";
                break;
            case 401:
                err.message = "未授权，请登录";
                break;
            case 403:
                err.message = "拒绝访问";
                break;
            case 404:
                err.message = `请求地址出错: ${err.response.config.url}`;
                break;
            case 408:
                err.message = "请求超时";
                break;
            case 500:
                err.message = "服务器内部错误";
                break;
            case 501:
                err.message = "服务未实现";
                break;
            case 502:
                err.message = "网关错误";
                break;
            case 503:
                err.message = "服务不可用";
                break;
            case 504:
                err.message = "网关超时";
                break;
            case 505:
                err.message = "HTTP版本不受支持";
                break;
            default:
        }
    }
    if (err.message) {
        kvaMessage.notifyError(err.message);
    }
    // 判断请求超时
    if ( err.code === "ECONNABORTED" && err.message.indexOf("timeout") !== -1) {
        kvaMessage.notifyError('服务已经离开地球表面，刷新或者重试...');
    }
    // 返回接口返回的错误信息
    return Promise.reject(err);
});

export default request
